package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.EmpDepAddDTO;
import org.jsola.hr.dto.EmpDepBatchDTO;
import org.jsola.hr.dto.EmpDepUpdateDTO;
import org.jsola.hr.query.EmpDepQuery;
import org.jsola.hr.query.EmpInfoQuery;
import org.jsola.hr.vo.EmpDepListVO;
import org.jsola.hr.vo.EmpDepVO;
import org.jsola.hr.vo.EmpInfoListVO;
import org.jsola.hr.vo.EmpReduceInfoVO;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @author zhr
 */
@Api(tags = "hr-员工部门关系")
public interface IEmpDepControllerAPI {

    /**
     * 新增员工部门关系
     * @param empDepAddDTO 员工部门关系新增实体
     * @return 员工部门关系展示对象
     */
    @ApiOperation(value = "新增员工部门关系")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepAddDTO", dataType = "EmpDepAddDTO", value = "新增员工部门关系", paramType = "body")
    })
    Result<EmpDepVO> save(EmpDepAddDTO empDepAddDTO);


    /**
     * 修改员工部门关系
     * @param empDepUpdateDTO 员工部门关系
     * @return 更新数量
     */
    @ApiOperation(value = "修改员工部门关系")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepUpdateDTO", dataType = "EmpDepUpdateDTO", value = "修改员工部门关系", paramType = "body")
    })
    Result<Integer> update(EmpDepUpdateDTO empDepUpdateDTO);

    /**
     * 批量编辑、新增、删除员工部门关系
     * @param empDepBatchDTO 要操作的员工部门关系
     * @return 操作之后的全部员工部门关系
     */
    @ApiOperation(value = "批量编辑、新增、删除员工部门关系")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepBatchDTO", dataType = "EmpDepBatchDTO", value = "要操作的字段数据", paramType = "body")
    })
    Result batch(EmpDepBatchDTO empDepBatchDTO);



    /**
     * 删除单个员工部门关系，彻底删除
     * @param empDepId 员工部门关系id
     * @return 删除数量
     */
    @ApiOperation(value="删除单个员工部门关系，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepId", dataType = "String", value = "员工部门关系id", paramType = "path")
    })
    Result<Integer> delete(String empDepId);


    /**
     * 批量删除员工部门关系，彻底删除
     * @param empDepIds 员工部门关系id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除员工部门关系，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepIds", dataType = "String[]", value = "员工部门关系id数组", paramType = "body" ,allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] empDepIds);


    /**
     * 根据员工部门关系id查询员工部门关系详情
     * @param empDepId 员工部门关系id
     * @return 员工部门关系详情
     */
    @ApiOperation(value="根据员工部门关系id查询员工部门关系详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepId", dataType = "String", value = "员工部门关系id", paramType = "path")
    })
    Result<EmpDepVO> findById(String empDepId);


    /**
     * 查询员工部门关系
     * @param empDepQuery 员工部门关系查询参数
     * @return page
     */
    @ApiOperation(value="查询员工部门关系")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepQuery", dataType = "EmpDepQuery", value = "员工部门关系查询参数", paramType = "query")
    })
    Result<List<EmpDepListVO>> listAll(EmpDepQuery empDepQuery);


     /**
     * 分页查询员工部门关系
     * @param empDepQuery 员工部门关系查询参数
     * @return page
     */
    @ApiOperation(value="分页查询员工部门关系")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepQuery", dataType = "EmpDepQuery", value = "员工部门关系查询参数", paramType = "query")
    })
    Result<Page<EmpDepListVO>> page(EmpDepQuery empDepQuery);

    /**
     * 根据部门ID查询员工列表分页
     * @param empInfoQuery 员工部门关系查询参数
     * @return page
     */
    @ApiOperation(value="根据部门ID查询员工列表分页")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empInfoQuery", dataType = "EmpInfoQuery", value = "员工查询参数", paramType = "query")
    })
    Result<Page<EmpInfoListVO>> getEmpListByDep(@Valid EmpInfoQuery empInfoQuery);

    /**
     * 修改员工部门分配
     * @param empDepAddDTO 员工部门关系参数
     * @return 更新数量
     */
    @ApiOperation(value = "修改员工部门分配")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepAddDTO", dataType = "EmpDepAddDTO", value = "修改员工部门分配", paramType = "body")
    })
    Result<Integer> empDistribute(@Valid @RequestBody EmpDepAddDTO empDepAddDTO);

    /**
     * 移除某部门下某些员工
     *
     * @param empIds 员工id数组
     * @return 删除数量
     */
    @ApiOperation(value = "移除某部门下某些员工")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "depId", dataType = "String", value = "部门id", paramType = "path"),
            @ApiImplicitParam(name = "empIds", dataType = "String[]", value = "员工id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteEmpByDep(String depId, String[] empIds);

    /**
     * 根据部门Id查询部门下人员
     *
     * @param empDepQuery 查询条件
     * @return
     */
    @ApiOperation(value = "根据部门Id查询部门下人员")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empDepQuery", dataType = "EmpDepQuery", value = "查询参数", paramType = "query")
    })
    Result<Page<EmpReduceInfoVO>> selectEmpByDepId(EmpDepQuery empDepQuery);
}

